package com.cskaoyan.shopping.controller.zxw;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cskaoyan.mall.commons.bean.Member;
import com.cskaoyan.mall.commons.result.ResponseData;
import com.cskaoyan.mall.commons.result.ResponseUtil;
import com.cskaoyan.mall.commons.util.MemberUtils;
import com.cskaoyan.mall.commons.util.jwt.JwtTokenUtils;
import com.cskaoyan.shopping.dto.CartProductDto;
import com.cskaoyan.shopping.dto.PanelDto;
import com.cskaoyan.shopping.form.CartRequest;
import com.cskaoyan.shopping.service.ICartService;
import com.cskaoyan.shopping.service.IProductService;
import com.cskaoyan.shopping.service.ZxwICartService;
import com.cskaoyan.shopping.service.ZxwIProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Set;

/**
 * @author 曾添乐啦
 * @since 2023/01/09 20:59
 */
@RestController
@RequestMapping("/shopping")
public class ZxwProductController {

    //商品
    // @Qualifier("zxwIProductServiceImpl")
    @Autowired
    ZxwIProductService iProductService;

    //购物车
    @Autowired
    ZxwICartService iCartService;



    /**
     * 请求参数
     * 请求路径：/shopping/recommend
     * 是否需要携带Token：否
     * 请求类型：get
     * 请求参数示例：无
     * 响应参数
     * success boolean 成功标记
     * message String 具体信息
     * code Integer 状态码
     * result String(JSON) 具体数据
     * timestamp Long 时间戳
     *
     * @return
     */
    //. 查询推荐商品
    @GetMapping("recommend")
    public ResponseData findRecommendProduct() {
        Set<PanelDto> recommendGoods = iProductService.getRecommendGoods();
        return new ResponseUtil().setData(recommendGoods, "success");
    }

    /**
     * 请求参数
     * 请求路径：/shopping/carts
     * 是否需要携带Token：是
     * 请求类型：get
     * 请求参数示例：无
     * 响应参数
     * success boolean 成功标记
     * message String 具体信息
     * code Integer 状态码
     * result String(JSON) 具体数据
     * timestamp Long 时间戳
     *
     * @return
     */
    //获得购物车列表
    //如果从请求头中获取token，形参格式@RequestHeader("user_info") String userInfo
    //HttpServletRequest request
    @GetMapping("carts")
    public ResponseData findShoppingCarts(HttpServletRequest request) {
        //从请求头里获取用户id，项目二也是直接从请求头获取的用户id。二者都没有把用户信息直接存放在cookie
        //假设写登录给的token是user_info
        //TODO：请求头中获取
        //JSONObject jsonObject = JSON.parseObject(userInfo);
        //long userId = Long.parseLong(jsonObject.get("uid").toString());
        //TODO:从cookie中获取token
        //取到就证明用户是登录状态
   /*     Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if ("access_token".equals(cookie.getName())){
                JSONObject jsonObject = JSON.parseObject(cookie.getName());
                long userId = Long.parseLong(jsonObject.get("uid").toString());
                List<CartProductDto> cartListById = iCartService.getCartListById(userId);
                // return new ResponseUtil().setData(cartListById);
                return new ResponseUtil<List>().setData(cartListById,"success");
            }
        }
        return new ResponseUtil<List>().setErrorMsg("请登录后，在访问购物车");*/
        //利用项目组成员提供的工具类获取用户信息
//        Member loginMember = MemberUtils.getLoginMember(request);
        String userInfo = request.getHeader("user_info");
        JSONObject object = JSON.parseObject(userInfo);
        Long userId = Long.parseLong(object.get("id").toString());

        List<CartProductDto> cartListById = iCartService.getCartListById(userId);
        return new ResponseUtil<List>().setData(cartListById,"success");
    }

    /**
     * 请求参数
     * userId Long 用户ID
     * productId Long 产品ID
     * productNum Integer 商品数量
     * <p>
     * 请求路径：/shopping/carts
     * 是否需要携带Token：是
     * 请求类型：post
     * 请求参数示例：
     * {"userId":"62","productId":100053202,"productNum":1}
     * 响应参数
     * success boolean 成功标记
     * message String 具体信息
     * code Integer 状态码
     * result String(JSON) 具体数据
     * timestamp Long 时间戳
     * <p>
     * 返回参数示例：
     * {
     * "success":true,
     * "message":"success",
     * "code":200,
     * "result":"成功",
     * "timestamp":1587794143256
     * }
     *
     * @return
     */

    //添加商品到购物车
    @PostMapping("carts")
    public ResponseData addProductsToCart(@RequestBody CartRequest cartRequest) {

        //CartRequest有一个成员变量checked,一般来说应该是这个service层处理，他这里已经给了service层方法，没有返回值
        //所以该成员变量需在controller层赋值
        //从接口文档更新购物车给的请求参数可知，该值对应一个选中操作
        //我们逛淘宝、美团，把商品加入购物车，购物车中商品左边的框框，默认状态是勾选状态
        cartRequest.setChecked("true");
        iCartService.addToCart(cartRequest);
        return new ResponseUtil().setData("成功","success");
        //return new ResponseUtil<String>().setData("success");
    }

    /**
     * 请求参数
     * userId Long 用户ID
     * productId Long 产品ID
     * productNum Integer 商品数量
     * checked String 是否选中
     * <p>
     * 请求路径：/shopping/carts
     * 是否需要携带Token：是
     * 请求类型：put
     * 请求参数示例：
     * {userId: "62", productId: 100053312, productNum: 3, checked: "true"}
     * <p>
     * 响应参数
     * success boolean 成功标记
     * message String 具体信息
     * code Integer 状态码
     * result String(JSON) 具体数据
     * timestamp Long 时间戳
     * <p>
     * {"success":true,"message":"success","code":200,"result":"成功","timestamp":1587794411224}
     *
     * @return
     */
    //更新购物车中的商品
    @PutMapping("carts")
    public ResponseData updateProduct(@RequestBody CartRequest cartRequest) {
        iCartService.updateCartNum(cartRequest);
        return new ResponseUtil().setData("成功","success");
    }
}

